iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
自我挑戰組

高中生也可以!利用強化學習讓機器人動起來!系列 第 6

D6:資料科學入門!numpy基礎(2/2)

  • 分享至 

  • xImage
  •  

昨天介紹了numpy的一些方法,今天要繼續深入numpy,事不宜遲,馬上開始吧

矩陣運算-內積

numpy除了基本四則運算外也有線性代數的一些矩陣運算,請看範例程式碼

內積(dot)是矩陣運算很基礎的內容,數學原理這邊就不贅述了,可以使用np.dot(array1,array2)計算array1跟array2的內積

a=np.array([[1,2,3],[4,5,6]])
b=np.array([[1,2],[3,4],[5,6]])
ab=np.dot(a,b)
print(ab)

可看到結果為

[[22 28]
 [49 64]]

矩陣運算-外積

跟內積一樣,外積(cross)也是矩陣運算很基礎的內容,當我們要計算外積的時候,就可以使用np.cross(array1,array2)來計算外積

a=np.array([1,2,3])
b=np.array([4,5,6])
ab=np.cross(a,b)
print(ab)

可看到結果為

[-3  6 -3]

矩陣運算-反矩陣

numpy也有相關的方法可以計算反矩陣,使用np.linalg.inv(array)可以計算array的反矩陣,需要注意的是如果陣列是奇異(不可逆)矩陣(singular matrix)的話將會引發錯誤,所以建議使用例外處理來處理

a=np.array([[1,2,3],[1,0,1],[7,8,9]])
try:
    inva=np.linalg.inv(a)
except np.linalg.LinAlgError as e:
    print(e)
else:
    print(inva)

可得結果:

[[-0.66666667  0.5         0.16666667]
 [-0.16666667 -1.          0.16666667]
 [ 0.66666667  0.5        -0.16666667]]

若為奇異矩陣的話

a=np.array([[1,2,3],[4,5,6],[7,8,9]])
try:
    inva=np.linalg.inv(a)
except np.linalg.LinAlgError as e:
    print(e)
else:
    print(inva)

可看到程式回傳錯誤內容:

Singular matrix

向量長度

我們可以使用np.linalg.norm(array)來計算一個向量長度,也可以計算兩個向量之間的歐式距離

a=np.array([1,2,3])
b=np.array([4,5,6])
a=np.linalg.norm(a) #計算a的長度
ab=np.linalg.norm(a-b) #計算a到b的距離
print(a) #3.7416573867739413
print(ab) #2.59812978828652

其他常用的計算函數

這邊我列出了我在做專案時較常使用到的計算函數,這幾個應該都算是基礎中的基礎了。

a=np.array([[1,2,3],
            [4,5,6],
            [7,8,9]])
print(np.min(a)) #求最小值
print(np.max(a)) #求最大值
print(np.ptp(a)) #求最大值最小值的差
print(np.mean(a)) #求平均
print(np.prod(a)) #求累乘乘積
print(np.sum(a)) #求總和

可以看到結果

1
9
8
5.0
362880
45

這些函數中還能再加入axis參數,代表指定維度做計算,axis=0通常代表每一直行,axis=1代表每一橫列,以min為例,如果是二維陣列的話可看到結果如下,每一直行的最小值分別為1,4,7,而每一橫列的最小值分別為1,2,3,其餘的方法也是同理。

a=np.array([[1,2,3],
						[4,5,6],
						[7,8,9]])
print(np.min(a,axis=0)) #[1 2 3]
print(np.min(a,axis=1)) #[1 4 7]

尋找符合條件的元素

np.where( )在資料分析中算是是很常用的函數,它可以幫你找出特定條件的元素索引值,例如今天要找大於5的元素,就可以使用np.where()

a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(np.where(a>5))

結果為

(array([1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2], dtype=int64))

代表索引值[1,2],[2,0],[2,1],[2,2]的元素都大於5。也可以將這些索引值代表的元素逐一列印出來。例如:

a=np.array([[1,2,3],[4,5,6],[7,8,9]])
index=np.where(a>5)
print(a[index]) 

結果為

[6 7 8 9]

另外一個用法為滿足條件輸出值,不滿足條件輸出另一個值,參數輸入如下np.where(判斷式,滿足條件的值,不滿足條件的值)

a=np.array([[1,2,3],
						[4,5,6],
						[7,8,9]])
print(np.where(a>5,1,0))

結果為

[[0 0 0]
 [0 0 1]
 [1 1 1]]

儲存&載入

當陣列需要被儲存以供之後使用的話,可以使用np.save()儲存,日後再用np.load()讀取處存的陣列

a=np.array([[1,2,3],[4,5,6],[7,8,9]])
np.save('your path.npy',a) #輸入要儲存的路徑,副檔名指定為.npy檔案
a=np.load('your path.npy',allow_pickle=True) #讀取npy檔案

結語

今日講了numpy剩餘的一些用法,不過numpy的功能遠遠不止這些,要講可能也講不完。但這些已經可以應付許多實作或者專案等了,明天會介紹如何使用matplotlib.pyplot(plt)來畫出一張圖,針對之後強化學習畫出reward的圖會有幫助。


上一篇
D5:資料科學入門!numpy基礎(1/2)
下一篇
D7:數據可視化!matplotlib教學
系列文
高中生也可以!利用強化學習讓機器人動起來!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言